package util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    private static final String SECRET_KEY = "河北师范大学软件学院是为适应我国经济结构的战略性调整和软件产业发展对人才的迫切需要，在深度整合学校优势学科资源和企业丰富实践经验的基础上发展起来的一个新工科学院。根据《国家中长期教育改革和发展规划纲要》和《国家中长期人才发展规划纲要》的精神，2010年教育部启动了高校“卓越工程师教育培养计划， “卓越计划”对高等工程教育改革发展提出了迫切要求：创新高校与行业企业联合培养人才的机制，改革工程教育人才培养模式，提升学生的工程实践能力、创新能力和国际竞争力。依托国家政策大前提和软件行业日新月异的发展态势，河北师范大学响应国家“培养软件人才，尽快提高我国软件产业的总体水平和国际竞争力”的号召，启动以“试点学院”推动河北师范大学教学改革的尝试，软件学院便成为了河北省首批以校企联动合作培养卓越软件开发工程师的试点学院。河北师范大学软件学院以学科专业建设为龙头，以推进科技创新、培养模式创新和发展方式创新为核心，紧密跟踪软件技术发展趋势，着力培养行业紧缺的软件工程师。专业依托软件行业前沿态势，面向人工智能、数据科学两大领域，开设了“智能软件开发、智能设备开发、移动互联网应用开发、自动化测试开发”四个专业方向。培养方案及课程体系紧贴市场需求，由学校与企业联合制定，并与国际接轨。课程体系在符合教育部专业规范的前提下，突出需求导向和应用性导向，加大实践课程比例，并依据市场需求变化及时进行动态调整，时刻保证专业课程设置及教学内容紧跟国际技术前沿，注重学生实践技能与创新精神的合力培养，确保为社会提供德才兼备的应用技能型高级软件人才。河北师范大学软件学院师资依托河北师范大学的基础课师资及具有丰富经验的企业师资，拥有一支高水平的“双师型”教师队伍，80%以上具有丰富互联网软件开发与设计经验。采取理论与实践并重的人才培养模式，积极搭建与企业交流合作平台，为学生成长成才提供全方位支持。河北师范大学软件学院在注重培养学生实践能力与创新精神的同时，积极搭建与优秀企业沟通合作的平台，打通毕业生名企就业渠道，毕业生就业企业涵盖阿里巴巴、腾讯、百度、美团、京东、新浪、搜狐等互联网知名企业。";

    private static final long EXPIRATION_TIME = 30L * 24 * 60 * 60 * 1000; // 30天，单位毫秒

    public static String generateToken(Long userId, String username) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(String.valueOf(userId))
                .claim("username", username)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()), SignatureAlgorithm.HS512)
                .compact();
    }

    public static Claims parseToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()))
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    public static boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                .setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()))
                .build()
                .parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static Long getUserIdFromToken(String token) {
        Claims claims = parseToken(token);
        return Long.parseLong(claims.getSubject());
    }

    public static String getUsernameFromToken(String token) {
        Claims claims = parseToken(token);
        return claims.get("username", String.class);
    }

    /**
     * 验证并解析token
     * @param authHeader Authorization header值
     * @return 包含验证结果的Map
     */
    public static Map<String, Object> validateAndParseToken(String authHeader) {
        Map<String, Object> result = new HashMap<>();
        
        // 检查header是否为空
        if (authHeader == null || authHeader.isEmpty()) {
            result.put("success", false);
            result.put("message", "未登录");
            return result;
        }
        
        // 检查并去除Bearer前缀
        String token = authHeader;
        if (authHeader.startsWith("Bearer ")) {
            token = authHeader.substring(7);
        }
        
        try {
            // 验证并解析token
            Claims claims = parseToken(token);
            result.put("success", true);
            result.put("userId", Long.parseLong(claims.getSubject()));
            result.put("username", claims.get("username", String.class));
            return result;
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "登录已过期");
            return result;
        }
    }
}